package day17;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Demo02 {
	public static void main(String[] args) {
		test05();
	}

	private static void test05() {
		// 关于遍历过程中增减元素的问题
		List<String> list = new ArrayList<String>();
		list.add("fdsagfa");
		list.add("alice");
		list.add("LaoWang");
		list.add("ZhangSan");
		list.add("Angelina");
		list.add("jack");

		// Iterator<E>只能移除元素

		// ListIterator<E>可以增减与替换
		//		ListIterator<String> it = list.listIterator();
		//		while (it.hasNext()) {
		//			if (it.next().equals("alice")) {
		//				// it.add("AAA");
		//				it.set("AAA");
		//			}
		//		}

		// foreach: 只能进行元素的获取, 不能对集合进行元素的增减操作
		// java.util.ConcurrentModificationException
		//		for (String str : list) {
		//			System.out.println(str);
		//			if (str.equals("alice")) {
		//				list.remove(str);
		//				list.add("tom");
		//			}
		//		}

		//		for (int i = 0; i < list.size(); i++) {
		//			System.out.println(list.get(i));
		//			if (list.get(i).equals("alice")) {
		//				list.add("tom");
		//				list.remove(i);
		//			}
		//		}

		// 通过索引遍历List集合时, 不要进行元素增减操作
		int size = list.size();
		for (int i = 0; i < size; i++) {
			// list.remove(i);
			list.add("val" + i);
		}
		System.out.println(list.size());
		System.out.println(list);

		// 总结: 如果只是获取元素, 几种遍历方式都可以
		// 如果在遍历过程中必须要进行元素移除操作: Iterator<E>
		// 如果在遍历过程中必须要进行元素添加操作: 考虑ListIterator<E>
		// 对于Set<E>集合, 最多只能通过Iterator<E>在遍历中移除元素
		// 不能进行元素的添加

	}

	private static void test04() {
		List<String> list = new ArrayList<String>();
		list.add("fdsagfa");
		list.add("alice");
		list.add("LaoWang");
		list.add("ZhangSan");
		list.add("Angelina");
		list.add("jack");

		// List集合遍历方式4: ListIterator<E>

		ListIterator<String> it = list.listIterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}

		System.out.println("---");

		while (it.hasPrevious()) {
			System.out.println(it.previous());
		}

	}

	private static void test03() {
		List<String> list = new ArrayList<String>();
		list.add("fdsagfa");
		list.add("alice");
		list.add("LaoWang");
		list.add("ZhangSan");
		list.add("Angelina");
		list.add("jack");

		// List集合遍历方式3: foreach语句
		// 语法
		// for (类型 引用名: 遍历目标) {}
		// 引用名指的是对遍历目标元素的引用
		// foreach语句使用前提: 遍历目标必须具备迭代器
		for (String str : list) {
			System.out.println(str);
		}

		// foreach除了可以遍历集合, 还能遍历数组
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		for (int i : arr) {
			System.out.println(i);
		}
	}

	private static void test02() {
		List<String> list = new ArrayList<String>();
		list.add("fdsagfa");
		list.add("alice");
		list.add("LaoWang");
		list.add("ZhangSan");
		list.add("Angelina");
		list.add("jack");

		// List集合的遍历方式2: 索引遍历
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
	}

	private static void test01() {
		// 创建一个List集合对象
		List<String> list = new ArrayList<String>();

		// 向容器中添加元素
		list.add("fdsagfa");
		list.add("alice");
		list.add("LaoWang");
		list.add("ZhangSan");
		list.add("Angelina");
		list.add("jack");

		// 集合中元素数量
		System.out.println(list.size());

		// 用Iterator迭代器遍历集合
		// 获取迭代器
		Iterator<String> it = list.iterator();
		// 判断是否有下一个元素, 并获取出元素
		while (it.hasNext()) {
			String str = it.next();
			System.out.println(str);
			// System.out.println(it.next());
			// System.out.println(it.next());
			if (str.equals("alice")) {
				it.remove();
			}
		}
		// java.util.NoSuchElementException
		// it.next();
		// 迭代器使用注意事项: 一次判断后只做一次获取
		System.out.println("-----");
		// 当迭代器使用完毕之后, 要再次迭代, 需要重新获取迭代器对象
		it = list.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}

	}
}
